/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package example.hello;

import java.io.IOException;
import java.io.PrintWriter;
import java.rmi.Naming;
import java.rmi.RemoteException;
import java.sql.SQLException;
import java.util.ArrayList;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 *
 * @author doo
 */
@WebServlet(name = "ControlForm", urlPatterns = {"/ControlForm"})
public class ControlForm extends HttpServlet {

    /**
     * Processes requests for both HTTP
     * <code>GET</code> and
     * <code>POST</code> methods.
     *
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    protected void processRequest(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
    }

    // <editor-fold defaultstate="collapsed" desc="HttpServlet methods. Click on the + sign on the left to edit the code.">
    /**
     * Handles the HTTP
     * <code>GET</code> method. Méthode GET de la servlet. Elle ne consiste qu'à
     * rediriger vers la page principale, pour le moment.
     *
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        processRequest(request, response);

        // Redirection vers le formulaire index.jsp
        getServletContext().getRequestDispatcher("/index.jsp")
                .forward(request, response);
    }

    /**
     * Handles the HTTP
     * <code>POST</code> method. Méthode POST de la servlet, utilisé lorsqu'on
     * appuie sur le bouton de validation du formulaire.
     *
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        processRequest(request, response);

        // On récupère les variables transmises par le formulaire dans index.jsp.
        // A savoir, le nom attribué au serveur, et les méthodes à exécuter.
        String nomServeurForm = (String) request.getParameter("nomServeur");
        String[] boxMethodes = request.getParameterValues("methodes");
        boolean processusChecked = false;
        boolean memoireChecked = false;
        boolean processeurChecked = false;
        // Code erreur pour identifier plus facilement l'erreur. S'il reste à 0;
        // ça veut dire que tout va bien.
        int err = 0;
        try {
            // Initialisation de booléennes pour dire au système s'il faut exécuter
            // une méthode ou non.
            for (int i = 0; i < boxMethodes.length; ++i) {
                System.out.println(boxMethodes[i]);
                if (boxMethodes[i].equals("processus")) {
                    processusChecked = true;
                } else if (boxMethodes[i].equals("memoire")) {
                    memoireChecked = true;
                } else if (boxMethodes[i].equals("processeur")) {
                    processeurChecked = true;
                }
            }
        } catch (Exception e) {
            // Sans méthodes sélectionnées, l'appplication n'a pas besoin de faire
            // le moindre traitement.
            System.out.println("[NOTICE] Aucune méthode de sélectionnée...");
            err = 99;
        }

        if (nomServeurForm == null || "".equals(nomServeurForm) || nomServeurForm.isEmpty()) {
            // Si aucun nom de serveur n'est renseigné, on initialise un message d'erreur
            // et on réenvoit l'utilisateur.
            request.setAttribute("erreur", "Vous devez renseigner une IP de serveur.");
            // Redirection vers le formulaire index.jsp
            getServletContext().getRequestDispatcher("/index.jsp")
                    .forward(request, response);
        } else {
            try {
                // Initialisation des objets des 3 méthodes à vide. Ils serront
                // tout 3 envoyés, même si certains serront vide. C'est l'interface
                // graphique qui se chargera de ne rien afficher si l'objet est vide.
                ArrayList<String> liste = null;
                String memoire = null;
                String cpu = null;
                Monitoring m = (Monitoring) Naming.lookup("//localhost/Monitoring");
                SystemInfo display = m.quid();
                System.out.println("ip du serveur : " + display.getIp().getIp());

                if (processusChecked) {
                    // Si la case processus a été cochée, on lance la méthode processus.
                    System.out.println("Début de la récupération de la liste des processus...");
                    liste = display.getProg().getProg();
                    InterfaceSQL requete = new InterfaceSQL();
                    String insert_processus = "INSERT INTO monito.grossetable (nom,methode,resultat) VALUES('"+display.getIp().getIp()+"', 'Processus'"+",'"+liste+"');";
                    requete.sendReq(InterfaceSQL.TypeReq.update, insert_processus);
                    requete.closeAll();
                    if (liste == null) {
                        // Si malgré le lancement de la méthode l'objet est toujours vide,
                        // il y a une erreur !
                        err = 1;
                    }
                    System.out.println("Liste des processus récupérée... Code de retour erreur : " + err);
                }

                if (memoireChecked) {
                    // Si la case mémoire a été cochée, on lance la méthode mémoire.
                    System.out.println("Début de la récupération d'un statut de mémoire...");
                    memoire = display.getRam().getRam();
                    InterfaceSQL requete = new InterfaceSQL();
                    String insert_memoire = "INSERT INTO monito.grossetable (nom,methode,resultat) VALUES('"+display.getIp().getIp()+"', 'ram'"+",'"+memoire+"');";
                    requete.sendReq(InterfaceSQL.TypeReq.update, insert_memoire);
                    requete.closeAll();
                    if (memoire == null) {
                        // Si malgré le lancement de la méthode l'objet est toujours vide,
                        // il y a une erreur !
                        err = 2;
                    }
                    System.out.println("Statut mémoire récupéré... Code de retour erreur : " + err);
                }

                if (processeurChecked) {
                    // Si la case CPU a été cochée, on lance la méthode CPU.
                    System.out.println("Début de la récupération d'un statut de processeur...");
                    cpu = display.getCpu().getCpu();
                    System.out.println(cpu);
                    InterfaceSQL requete = new InterfaceSQL();
                    String insert_cpu = "INSERT INTO monito.grossetable (nom,methode,resultat) VALUES('"+display.getIp().getIp()+"', 'CPU'"+",'"+cpu+"');";
//                    String insert_cpu = "INSERT INTO monito.grossetable (nom,methode,resultat) VALUES ('toto', 'toto', 'toto');";
                    System.out.println(insert_cpu);

                    requete.sendReq(InterfaceSQL.TypeReq.update, insert_cpu);
                    requete.closeAll();
                    if (cpu == null) {
                        // Si malgré le lancement de la méthode l'objet est toujours vide,
                        // il y a une erreur !
                        err = 3;
                    }
                    System.out.println("Statut de processeur récupéré... Code de retour erreur : " + err);
                }

                if (err == 0) {
                    PrintWriter out = response.getWriter();
                    out.println("<html>");
                    out.println(" <head>");
                    out.println("CPU : ");

                    out.println("<br />");
                    out.println(cpu);
                    out.println("<br />");
                    out.println("<br />");
                    out.println("Memoire libre : ");
                    out.println("<br />");

                    out.println(memoire);
                    out.println("<br />");
                    out.println("<br />");
                    out.println("Liste Processus : ");
                    out.println("<br />");

                    out.println(liste);

                    out.println(" </head>");
                    out.println("<br />");
                    out.println("<br />");
                    out.println("<a href=\"index.jsp\">Retour</a>");

                } else if (err == 99) {
                    // En cas d'erreur 99, on génère une page d'erreur.
                    PrintWriter out = response.getWriter();
                    out.println("<html>");
                    out.println(" <head>");
                    out.println(" <title>Erreur !</title>");
                    out.println(" </head>");
                    out.println(" <body>");
                    out.println(" <h1>Notice</h1>");
                    out.println(" Date : " + (new java.util.Date().toString())
                            + ". Vous devez selectionner au moins une methode pour avoir un resultat.");
                    out.println("<br />");

                    out.println(" <a href=\"index.jsp\">Retour</a>");
                    out.println(" </body>");
                    out.println("</html>");
                } else {
                    // En cas d'autre code d'erreur, on génère une autre page d'erreur.
                    PrintWriter out = response.getWriter();
                    out.println("<html>");
                    out.println(" <head>");
                    out.println(" <title>Erreur !</title>");
                    out.println(" </head>");
                    out.println(" <body>");
                    out.println(" <h1>Erreur lors de la recuperation des objets</h1>");
                    out.println(" Nous sommes le " + (new java.util.Date().toString())
                            + " et nous ne sommes pas parvenu a recuperer les informations sur ce systeme.");
                    out.println("<br />");
                    out.println("<br />");
                    out.println(" <a href=\"index.jsp\">Retour</a>");
                    out.println(" </body>");
                    out.println("</html>");
                }
            } catch (Exception e) {
                // Sans communication avec le serveur, on génère une page d'erreur.
                PrintWriter out = response.getWriter();
                out.println("<html>");
                out.println(" <head>");
                out.println(" <title>Erreur !</title>");
                out.println(" </head>");
                out.println(" <body>");
                out.println(" <h1>Erreur lors de la connexion</h1>");
                out.println(" Nous sommes le " + (new java.util.Date().toString())
                        + " et nous ne parvenons pas a communiquer avec le serveur. Message : " + e.getMessage());
                out.println("<br />");
                out.println("<br />");
                out.println(" <a href=\"index.jsp\">Retour</a>");
                out.println(" </body>");
                out.println("</html>");
            }
        }
    }

    public void cleanDB() throws SQLException {
        InterfaceSQL requete = new InterfaceSQL();
        String drop1 = "truncate grossetable;";
        requete.sendReq(InterfaceSQL.TypeReq.truncate, drop1);
        requete.closeAll();
    }

    /**
     * Returns a short description of the servlet.
     *
     * @return a String containing servlet description
     */
    @Override
    public String getServletInfo() {
        return "Short description";
    }
}
